﻿--- Eliminar las funciones existentes sin importar el numero ni tipo de parametros
SELECT * FROM "DropFunction_AWIL"('FuncOrdTrabajoRecMercanciaItemSerial');
--- crear una nueva funcion
CREATE FUNCTION "FuncOrdTrabajoRecMercanciaItemSerial"(
	 IN	"@OP" CHARACTER VARYING(64)
	,IN	"@paramAux" TEXT
	,INOUT	"@id" INTEGER
	,INOUT	"@fechaGrab" timestamp
	,INOUT	"@usuarioGrab" character varying(32)
	,INOUT	"@activo" boolean
	,INOUT	"@codOrdTrabajo" character varying(16)
	,INOUT	"@codOrdTrabajoRecMercancia" CHARACTER VARYING(16)
	,INOUT	"@codOrdTrabajoRecMercanciaItem" INTEGER
	,INOUT	"@codOrdTrabajoRecMercanciaItemSerial" CHARACTER VARYING(16)
	,INOUT	"@observaciones" CHARACTER VARYING(256)	
	,INOUT	"@serial" CHARACTER VARYING(32)
	,INOUT	"@consecutivo" INTEGER
)RETURNS 
	SETOF RECORD
AS $$ 
DECLARE
	Auxiliar TEXT;
	Auxiliar2 INTEGER;
	pagina INTEGER;
	numRegistrosPorPagina INTEGER;
	codOrdTrabajo CHARACTER VARYING(16);
	codRecMercancia CHARACTER VARYING(16);
	codRecMercanciaItem INTEGER;
	
BEGIN

	/*SELECT BY ID*/
	IF "@OP"='selectById' THEN
		RETURN	QUERY
		SELECT	
			 "id","fechaGrab","usuarioGrab","activo","codOrdTrabajo"
			,"codOrdTrabajoRecMercancia","codOrdTrabajoRecMercanciaItem","codOrdTrabajoRecMercanciaItemSerial"
			,"observaciones","serial","consecutivo"
		FROM	
			"OrdTrabajoRecMercanciaItemSerial"
		WHERE	"id"="@id";
	RETURN;
	END IF;

	/*SELECT BY ID OT*/
	IF "@OP"='selectByIdOrdTrabajoRecMercanciaItem' THEN

		--- obtengo la pagina
		Auxiliar = substring("@paramAux", 1, position('|' in "@paramAux") -1); 
		pagina=coalesce(CAST(Auxiliar as INTEGER),0);
		--- obtengo el numero de registros por pagina
		Auxiliar = substring("@paramAux", position('|' in "@paramAux")+1, length("@paramAux")); 
		numRegistrosPorPagina=coalesce(CAST(Auxiliar as INTEGER),-1);
		
		--- con esta sentencia muestro todos los resultados de la tabla
		if numRegistrosPorPagina<0 then 
			numRegistrosPorPagina=1000000;
		end if;
		
		RETURN	QUERY
		SELECT	
			 t1."id",t1."fechaGrab",t1."usuarioGrab",t1."activo",t1."codOrdTrabajo"
			,t1."codOrdTrabajoRecMercancia",t1."codOrdTrabajoRecMercanciaItem",t1."codOrdTrabajoRecMercanciaItemSerial"
			,t1."observaciones",t1."serial",t1."consecutivo"
		FROM	
			"OrdTrabajoRecMercanciaItemSerial" t1
			INNER JOIN "OrdTrabajoRecMercanciaItem" t2
				ON  t1."codOrdTrabajoRecMercancia"=t2."codOrdTrabajoRecMercancia"
				AND t1."codOrdTrabajoRecMercanciaItem"=t2."codOrdTrabajoRecMercanciaItem"
		WHERE	
			t2.id="@id"
		ORDER BY 
			t1."id"
		LIMIT 
			numRegistrosPorPagina 
		OFFSET 
			numRegistrosPorPagina*pagina;
	RETURN;
	END IF;

	/*SELECT TODOS*/
	/*
	IF "@OP"='selectAll' THEN
		RETURN	QUERY
		SELECT	
			"id","fechaGrab","usuarioGrab","activo","codOrdTrabajo"
			,"codOrdTrabajoRecMercancia","codOrdTrabajoRecMercanciaItem","codOrdTrabajoRecMercanciaItemSerial"
			,"codMaeMaterial","codPaisFabricacion","codMaeObservacionItem","descOtroMaeObservacionItem","referencia","modelo","descripcion"
			,"cantidad","anoFabricacion","observaciones","serial","estado","consecutivo"
		FROM	
			"OrdTrabajoRecMercanciaItem";
	RETURN;
	END IF;
	*/
	
	/*INSERTAR NUEVO REGISTRO*/
	IF "@OP"='insert' THEN

		IF trim("@observaciones")='' THEN
			Auxiliar = 'Debe digitar las observaciones generales, verifique.';
			RAISE EXCEPTION '%', Auxiliar;
		END IF;
		IF trim("@serial")='' THEN
			Auxiliar = 'Debe digitar el serial, verifique.';
			RAISE EXCEPTION '%', Auxiliar;
		END IF;

		--- verifico que el serial no se haya asociado antes al ITEM
		IF EXISTS (
			SELECT	t1.id 
			FROM	"OrdTrabajoRecMercanciaItemSerial" t1 INNER JOIN "OrdTrabajoRecMercanciaItem" t2 ON  t1."codOrdTrabajoRecMercancia"=t2."codOrdTrabajoRecMercancia" AND t1."codOrdTrabajoRecMercanciaItem"=t2."codOrdTrabajoRecMercanciaItem"
			WHERE	t2.id="@id" AND t1."serial"="@serial"
		) THEN
			Auxiliar = 'El serial "' || "@serial" || '" ya se encuentra asociado a este Item, verifique.';
			RAISE EXCEPTION '%', Auxiliar;
		END IF;
		
		-- obtengo el codigo del reconocimiento y del item
		select	"codOrdTrabajoRecMercanciaItem" INTO codRecMercanciaItem
		from	"OrdTrabajoRecMercanciaItem" 
		where	id="@id";

		select	"codOrdTrabajoRecMercancia" INTO codRecMercancia
		from	"OrdTrabajoRecMercanciaItem" 
		where	id="@id";

		select	"codOrdTrabajo" INTO codOrdTrabajo	
		from	"OrdTrabajoRecMercanciaItem" 
		where	id="@id";

		-- genero el codigo del subitem (consecutivo)
		Auxiliar2=null;
		select	MAX("consecutivo")+1 INTO Auxiliar2
		FROM	"OrdTrabajoRecMercanciaItemSerial"
		WHERE	"codOrdTrabajoRecMercancia"=codRecMercancia AND "codOrdTrabajoRecMercanciaItem"=codRecMercanciaItem;
		Auxiliar2=coalesce(Auxiliar2,1);

		
		
		-- Grabo el registro
		INSERT INTO "OrdTrabajoRecMercanciaItemSerial"
		(
			 "usuarioGrab","usuarioUltMod","activo"
			,"codOrdTrabajo","codOrdTrabajoRecMercancia","codOrdTrabajoRecMercanciaItem","codOrdTrabajoRecMercanciaItemSerial"
			,"observaciones","serial","consecutivo"
		)
		VALUES	 
		(
			 "@usuarioGrab","@usuarioGrab",coalesce("@activo",TRUE)
			,codOrdTrabajo,codRecMercancia,codRecMercanciaItem
			,CAST(codRecMercanciaItem AS CHARACTER VARYING(16)) || '.' || CAST(Auxiliar2 AS CHARACTER VARYING(16))
			,"@observaciones","@serial",Auxiliar2
		);

		RETURN	QUERY
		SELECT	
			 "id","fechaGrab","usuarioGrab","activo","codOrdTrabajo"
			,"codOrdTrabajoRecMercancia","codOrdTrabajoRecMercanciaItem","codOrdTrabajoRecMercanciaItemSerial"
			,"observaciones","serial","consecutivo"
		FROM	
			"OrdTrabajoRecMercanciaItemSerial"
		ORDER BY id DESC LIMIT 1;

	RETURN;
	END IF;

	/*ACTUALIZAR REGISTRO*/
	/*
	IF "@OP"='update' THEN

		--- Verifico los campos vacios
		IF trim("@referencia")='' THEN
			Auxiliar = 'La Referencia digitada no es valida, verifique.';
			RAISE EXCEPTION '%', Auxiliar;
		END IF;
		IF trim("@modelo")='' THEN
			Auxiliar = 'El Modelo digitado no es valido, verifique.';
			RAISE EXCEPTION '%', Auxiliar;
		END IF;
		IF trim("@descripcion")='' THEN
			Auxiliar = 'La Descripcion digitada no es valida, verifique.';
			RAISE EXCEPTION '%', Auxiliar;
		END IF;
		IF "@cantidad"<0 THEN
			Auxiliar = 'La cantidad no puede ser negativa, verifique.';
			RAISE EXCEPTION '%', Auxiliar;
		END IF;
		IF "@anoFabricacion"<0 THEN
			Auxiliar = 'El ano de fabricacion no es valido, verifique.';
			RAISE EXCEPTION '%', Auxiliar;
		END IF;
		IF trim("@serial")='' THEN
			Auxiliar = 'Debe digitar el serial del Serial, verifique.';
			RAISE EXCEPTION '%', Auxiliar;
		END IF;
		IF trim("@estado")='' THEN
			Auxiliar = 'Debe digitar el Estado del Serial, verifique.';
			RAISE EXCEPTION '%', Auxiliar;
		END IF;
		
		--- Verifico que no exista el reconocimiento de mercancia
		IF NOT EXISTS (SELECT 1 FROM "OrdTrabajoRecMercancia" WHERE "codOrdTrabajoRecMercancia"="@codOrdTrabajoRecMercancia") THEN
			Auxiliar = 'El reconocimiento de mercancia con codigo "' || "@codOrdTrabajoRecMercancia" || '" NO Existe, verifique.';
			RAISE EXCEPTION '%', Auxiliar;
		END IF;

		IF NOT EXISTS (SELECT 1 FROM "MaeMaterial" WHERE "codMaeMaterial"="@codMaeMaterial") THEN
			Auxiliar = 'El Material indicado NO es valido, verifique.';
			RAISE EXCEPTION '%', Auxiliar;
		END IF;
		IF NOT EXISTS (SELECT 1 FROM "MaeMaterial" WHERE "codMaeMaterial"="@codMaeMaterial" and activo=true) THEN
			Auxiliar = 'El Material indicado NO ESTA ACTIVO, verifique.';
			RAISE EXCEPTION '%', Auxiliar;
		END IF;

		IF NOT EXISTS (SELECT 1 FROM "MaePais" WHERE "codPaisFabricacion"="@codPaisFabricacion") THEN
			Auxiliar = 'El Pais de Fabricacion indicado NO es valido, verifique.';
			RAISE EXCEPTION '%', Auxiliar;
		END IF;
		IF NOT EXISTS (SELECT 1 FROM "MaePais" WHERE "codPaisFabricacion"="@codPaisFabricacion" and activo=true) THEN
			Auxiliar = 'El Pais de Fabricacion indicado NO ESTA ACTIVO, verifique.';
			RAISE EXCEPTION '%', Auxiliar;
		END IF;

		--- Actualizo el registro
		UPDATE	
			"OrdTrabajoRecMercanciaItemSerial" 
		SET	
			 "activo"=coalesce("@activo","activo")
			,"fechaUltMod"=NOW() 
			,"usuarioUltMod"="@usuarioGrab" 
			,"codOrdTrabajo"="@codOrdTrabajo"
			,"codOrdTrabajoRecMercancia"="@codOrdTrabajoRecMercancia"
			,"codOrdTrabajoRecMercanciaItem"="@codOrdTrabajoRecMercanciaItem"
			,"codMaeMaterial"="@codMaeMaterial"
			,"codPaisFabricacion"="@codPaisFabricacion"
			,"referencia"="@referencia"
			,"modelo"="@modelo"
			,"descripcion"="@descripcion"
			,"cantidad"="@cantidad"
			,"anoFabricacion"="@anoFabricacion"
			,"observaciones"="@observaciones"
			,"serial"="@serial"
			,"estado"="@estado"
			,"consecutivo"="@consecutivo"
		WHERE	
			"id"="@id";

	RETURN;
	END IF;
	*/
	
	/*ELIMINAR REGISTRO*/
	IF "@OP"='delete' THEN

		--- Borro el registro
		DELETE FROM "OrdTrabajoRecMercanciaItemSerial" 
		WHERE "id"="@id";

	RETURN;
	END IF;


--- Controlo que se haya digitado el OP correctamente
IF "@OP" IS NOT NULL THEN
	Auxiliar = 'El OP "' || "@OP" || '" No existe, verifique.';
	RAISE EXCEPTION '%', Auxiliar;
RETURN;
END IF;
END;
$$ LANGUAGE 'plpgsql';

